var mySystemPlatform,myCurrentDeviceId,serviceUuid='0000FF0A-0000-1000-8000-00805F9B34FB',writeUuid='0000FF08-0000-1000-8000-00805F9B34FB',notifyUuid='0000FF09-0000-1000-8000-00805F9B34FB';
var myServiceUrl='http://192.168.0.179:8888',deviceLocalNameArray={'2AKC':1,'2AK9':2,'2AKA':3,'2AKB':4},currentDeviceLoaclName;
var deviceLocalHistoryStore=new Array();
//用于记录当前进行到什么阶段，好让突然断开连接的时候重新连接要展示什么界面
//(0代表还没去云端查是否注册过,
//1代表查了但是没有显示填写身体信息界面（查询失败）,
//2代表显示了身体信息的界面但没有点下一步(查询成功),
//3代表隐藏了身体信息的界面显示了选择是否消除记录的界面,
//4代表用户选择了是否消除记录，选择界面隐藏了，并且去自己云端注册
//5代表向自己的云端注册失败
//6代表向自己的云端注册成功，并开始去清除设备本地的历史运动数据
//7代表设备本地历史运动数据清除失败
//8代表设备本地历史运动数据清除成功，并向华为云端发起了设备注册请求
var currentStep=0;
//向华为云端注册完成的回调
function afterRegisterCallback(resultStr){//这个回调函数基本没有作用，因为注册成功之后页面就会自动跳转到注册成功的界面
    var jsonObject=JSON.parse(resultStr);
    if(jsonObject['errCode']==0)
        console.log('设备向云端注册成功');
    else
        console.log('设备向云端注册失败');
    //window.hilink.finishDeviceActivity();//返回九宫格界面,window.hilink.moveToMainActivity()只能用在setting界面
}
//notify传回信息的回调
function notifyCallback(resultStr){
    var jsonObject=JSON.parse(resultStr);
    console.log(jsonObject['characteristicId']+'的notify传来了数据:'+jsonObject['data']);	
    if(jsonObject['characteristicId'].toUpperCase()==notifyUuid){
     	switch(jsonObject['data'][3]){
      		case '2':
      			if (jsonObject['data'][7]=='1') {
      				currentStep=8;//代表设备本地数据清除成功，并且向华为云端注册
      				console.log('清除数据成功,现在去华为的云端注册设备');
      				window.hilink.registerBleDevice(myCurrentDeviceId, '1.0', '1.0', 'afterRegisterCallback');//清除设备本地历史数据成功了之后去华为云端注册设备  
      			}else{
      				currentStep=7;//代表设备本地数据清除失败
      				console.log('清除数据失败');
      			}
      			break;
      		case '0':
      			if(jsonObject['data'][2]=='4'){//如果是获取历史数据
      				console.log('startTime: '+jsonObject['data'].substring(6,18));
      				console.log('sportCount: '+jsonObject['data'].substring(30,34));
      				var startTime=transformHexToTime(jsonObject['data'].substring(6,18));
      				var endTime=transformHexToTime(jsonObject['data'].substring(18,30));
      				var sportCount=parseInt(jsonObject['data'].substring(30,34),16);
      				var maxHeartRate=parseInt(jsonObject['data'].substring(38,40),16);
      				var minHeartRate=parseInt(jsonObject['data'].substring(40,42),16);
      				var logObject=new Object();
      				logObject['startTime']=startTime;
      				logObject['endTime']=endTime;
      				logObject['sportCount']=sportCount;
      				logObject['maxHeartRate']=maxHeartRate;
      				logObject['minHeartRate']=minHeartRate;
      				logObject['calorie']=calculateCalorie(sportCount,app.sex,app.bodyHeight,app.bodyWeight,app.age,deviceLocalNameArray[currentDeviceLoaclName.substring(14,18)],1);//计算消耗卡路里
      				logObject['sportMode']=1;//默认第一种模式
      				deviceLocalHistoryStore.push(logObject);//将历史数据储存在数组里
      			}
      			break;
      		case '1'://如果是说历史数据拿完了
      				console.log('设备本地历史数据采集完毕,现在去清除设备本身储存的历史运动数据');
      				registerDeviceToMyServer();//历史数据拿完了就去自己的云端注册
      				break;
      		case '4'://如果是同步时间完成了的话		
      				if (jsonObject['data'][7]=='1'){//如果同步时间成功的话的话
      					console.log('设备同步时间成功');
      					getDeviceLocalData();//就去获取设备本身的历史运动数据
      				}else
      					console.log('设备同步时间失败');
      				break;	
        }
    }
}
//向设备发起读特征值之后的回调，用于读取苹果设备的mac地址
function readCharacteristicCallback(resultStr){
    var jsonObject=JSON.parse(resultStr);
    console.log('ios手机读取设备的mac地址为:'+jsonObject['data']+' 现在去云端注册设备');
    window.hilink.registerBleDevice(jsonObject['data'], '1.0', '1.0', 'afterRegisterCallback');//云端注册
}
//服务发现完成之后的回调
function discoverdServiceCallback(resultStr){
    var jsonObject=JSON.parse(resultStr);
    if(jsonObject['errCode']==0){//如果服务发现成功就去云端注册
    	console.log('发现服务成功,现在去开启notify通道');
    	var resCode=window.hilink.notifyBLECharacteristicValueChange (myCurrentDeviceId, serviceUuid, notifyUuid, true);//开启notify
    	console.log(resCode==0?'开启notify通道成功':'开启notify通道失败');
        window.hilink.onBLECharacteristicValueChange('notifyCallback');//注册notify的回调 
        switch(currentStep){
        	case 0://如果现在是第一次连接的话
        		currentStep=1;//表示现在要去查自己的云端该设备是否有注册过       
        		if(mySystemPlatform=='Android')//安卓的话deviceId就是设备mac地址
        			checkDeviceIsRegister();
        		else if(mySystemPlatform=='Ios')//如果是ios的话就要去读取特征值获取mac地址
           			window.hilink.readBLECharacteristicValue (myCurrentDeviceId, '180A', '2A23', 'readCharacteristicCallback');//读取特征值
           		break;
           	case 1://如果查询失败
           		checkDeviceIsRegister();//再去自己云端查询一次
           		break;
           	case 6://如果向自己云端注册成功并去清除设备本地记录但是还没有返回结果
           		cleanDeiviceLoaclData();//去清除设备记录
           		break;
           	case 7://如果设备记录清除失败
           		cleanDeiviceLoaclData();//去清除设备记录
           		break;
        }    
    }else{
        console.log('发现服务失败,现在尝试再连接一次');              
        window.hilink.createBLEConnection(myCurrentDeviceId);//连接设备
    }                
}
//连接状态发生改变的回调
function connectStageChangeCallback(resultStr){
	var jsonObject=JSON.parse(resultStr);
	if(jsonObject['connected']){//如果连接成功就去发现服务
		console.log('连接成功,现在去发现服务');
        window.hilink.onBLEServicesDiscovered('discoverdServiceCallback');//注册发现完服务之后的回调,要在连接成功之后注册此回调才有用
	}
    else{//如果连接失败就继续尝试去连接
        console.log('连接断开,再去连接一次');
        window.hilink.createBLEConnection(myCurrentDeviceId);//连接设备
    }
}

//写入数据之后完成的回调
function writeDataCallback(errCode){
	if(errCode==0)
		console.log('数据写入成功');
	else
		alert('数据写入失败(内部错误/系统错误)');
}

//获取用户点击的未注册的设备的回调函数
function getUnregisteredCallback(resultStr){
	var jsonObject=JSON.parse(resultStr);
    myCurrentDeviceId=jsonObject['deviceId'];
    currentDeviceLoaclName=jsonObject['localName'];
    console.log('用户点击未注册的设备名称为:'+currentDeviceLoaclName+' mac地址为:'+myCurrentDeviceId+' 现在去连接此设备');
    window.hilink.onBLEConnectionStateChange('connectStageChangeCallback');//注册连接状态改变之后的回调
    window.hilink.createBLEConnection(myCurrentDeviceId);//连接设备
}
//注册设备
function deviceRegister(systemPlatform){
	mySystemPlatform=systemPlatform;
	window.hilink.getCurrentUnregisteredDevice('this.getUnregisteredCallback');//获取用户点击的未注册的设备信息
}

//清除设备本身储存的历史数据
function cleanDeiviceLoaclData(){
	console.log('现在去清除设备本身储存的历史运动数据');
	window.hilink.writeBLECharacteristicValue(myCurrentDeviceId, serviceUuid, writeUuid, 'FEA20101', 'writeDataCallback');//清除设备本身储存的历史运动数据
}

//获取设备本身的历史运动数据
function getDeviceLocalData(){
	console.log('现在去获取设备本身储存的历史运动数据');
	window.hilink.writeBLECharacteristicValue(myCurrentDeviceId, serviceUuid, writeUuid, 'FEA10101', 'writeDataCallback');//获取设备本身储存的历史运动数据
}

//将16进制的时间字符串转换为时间字符串
function transformHexToTime(hexString){
	var year=2010+parseInt(hexString.substring(0,2),16);
	var month=parseInt(hexString.substring(2,4),16);
	var day=parseInt(hexString.substring(4,6),16);
	var hour=parseInt(hexString.substring(6,8),16);
	var min=parseInt(hexString.substring(8,10),16);
	var second=parseInt(hexString.substring(10,12),16);
	return year+'-'+formatTime(month)+'-'+formatTime(day)+' '+formatTime(hour)+':'+formatTime(min)+':'+formatTime(second);
}

//将小于10的数字前面添加0
function formatTime(time){
	return time<10?'0'+time:time;
}

//计算消耗的卡路里
function calculateCalorie(sportCount,sex,bodyHeight,bodyHeight,age,devType,sportMode){
	return sportCount*0.75;
}

//同步设备时间
function synchhDeviceTime(){
	var myDate = new Date()
    var year = (myDate.getYear()-110);
    var month = '0'+(myDate.getMonth()+1).toString(16);
    var date = myDate.getDate();
    var hours = myDate.getHours();
    var minutes = myDate.getMinutes();
    var second = myDate.getSeconds();
    var day = myDate.getDay();
    var getDay,getTime;//getDay是星期几，getTime是最后的时间字符串
    if(year < 16)
        year = '0' + year.toString(16);
    else
        year = year.toString(16);
    if(date < 16)
        date = '0' + date.toString(16);
    else
        date = date.toString(16);
    if(hours < 16)
        hours = '0' + hours.toString(16);
    else
        hours = hours.toString(16);       
    if(minutes < 16)
        minutes = '0' + minutes.toString(16);
    else
        minutes = minutes.toString(16);
    if(second < 16)
        second = '0' + second.toString(16);
    else
        second = second.toString(16);
    if(day == 0){
       	getDay = day+7;
        getDay = '0'+getDay.toString();
        getTime = year.concat(month,date,hours,minutes,second,getDay);
    }else{
        day = '0'+day.toString();
        getTime = year.concat(month,date,hours,minutes,second,day);
    }
    console.log('开始同步当前时间:'+getTime+' 到设备');
    window.hilink.writeBLECharacteristicValue(myCurrentDeviceId, serviceUuid, writeUuid, 'FEA407'+getTime, 'writeDataCallback');	
}

//去自己云端注册设备信息
function registerDeviceToMyServer(){
	console.log('现在去自己的运动注册设备');
	var registerObject=new Object();
    registerObject['macAddress']=myCurrentDeviceId;//设备Mac地址
    var index=currentDeviceLoaclName.lastIndexOf('-')+2;
    registerObject['devType']=deviceLocalNameArray[currentDeviceLoaclName.substring(index,index+4)];//设备类型
    registerObject['sex']=app.sex==1;//设备使用者性别
    registerObject['height']=app.bodyHeight;//设备使用者的身高
    registerObject['weight']=app.bodyWeight;//设备使用者的体重
    registerObject['age']=app.age;//设备使用者的年龄
    registerObject['toDeleteHistory']=app.isToCleanHistory;//是否要将设备云端的历史记录清除
    registerObject['sportLogs']=deviceLocalHistoryStore;//设备本地储存的历史运动记录
    console.log(registerObject);
    Vue.http.post(myServiceUrl+'/register',registerObject).then(function(res){//去自己云端注册设备
    	currentStep=6;//代表向自己云端注册成功,并开始去清除设备本地的历史云端记录
    	console.log('在自己的云端注册设备成功');
    	cleanDeiviceLoaclData();//清除设备本地的历史运动记录
    },function(res){
    	currentStep=5;//代表向自己云端注册失败
      	console.log('往自己云端注册设备失败,返回状态码:'+res.status);
    });
}

//去自己的云端查询该设备是否已经注册
function checkDeviceIsRegister(){
	console.log('去自己云端查询该设备是否有注册记录');
	Vue.http.get(myServiceUrl+"/hasRegister/"+myCurrentDeviceId).then(function(res){
		console.log(res);
		console.log("查询成功,现在将填写身体运动信息的表达单显示出来");
        var data=res.body;//获取到了自己运动传回来的数据
        app.sex=data.sex?1:0;
        app.bodyHeight=data.height.toFixed(1);
        app.bodyWeight=data.weight.toFixed(1);
        app.age=data.age;
        app.bodyMsgSeen=true;//将填写身体信息的表单显示出来
        app.hasRegister=data.hasRegister;
        currentStep=2;//代表现在已经将身体信息的表单显示出来了，但是用户还没有点击下一步
    },function(){
        console.log('查询失败');
    });
}
